/*****************************************************************
* 一个简单的C扩展模块，可供python使用，名称：'hello'；
* 把它编译成Python路径中的'.so'文件，导入并调用 hello.message
*****************************************************************/

#include <Python.h>
#include <string.h>

/* 模块函数 */
static PyObject *                                           //返回对象
message(PyObject *self, PyObject *args)                     //self在模块里没有用到
{                                                           //Python调用的参数
    char *fromPython, result[1024];
    if (! PyArg_Parse(args, "(s)", &fromPython))            //转换Python -> C
        return NULL;                                        //null = 抛出异常
    else {
        strcpy(result, "Hello, ");                          //组件C字符串
        strcat(result, fromPython);                         //添加传入的Python字符串
        return Py_BuildValue("s", result);                  //转换C -> Python
    }
}

/* 注册表 */
static PyMethodDef hello_methods[] = {
    {"message", message, METH_VARARGS, "func doc"},         //名称，&函数，格式，文档
    {NULL, NULL, 0, NULL}                                   //表末端标识符
};

/* 模块定义结构 */
static struct PyModuleDef hellomodule = {
    PyModuleDef_HEAD_INIT,
    "hello",                                                //模块名称
    "mod doc",                                              //模块文档，可以是NULL
    -1,                                                     //各解释器的模块状态的大小，.1 = 存储在全局变量中
    hello_methods                                           //连接到放发表
};

/* 模块初始化 */
PyMODINIT_FUNC
PyInit_hello()                                              //首次导入时得到的调用
{                                                           //如果是动态装在那么需要注意名称
    return PyModule_Create(&hellomodule);
}
